프로세스와 스레드
우리가 흔히 개발하다보면, 멀티 프로세스, 멀티 스레드 등의 용어를 흔히 접할 수 있습니다. 저 또한 추상적으로(?) 이해만 하던 것을 명확하게 알기 위해서 정리해 보았습니다.
1. 프로세스
-
실행 중인 프로그램
-
OS로부터 실행에 필요한 자원(메모리)를 할당받아 프로세스가 실행됨
-
Code + Data + Heap + Stack 영역으로 이루어짐
-
Code : 실행 명령을 포함하는 코드들
-
Data : static 변수 혹은 global 변수
-
Heap : 동적 메모리 영역
-
Stack : 지역변수, 매개변수, 반환값 등 일시적인 데이터
-
2. 스레드
- 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것
- 가벼운 프로세스, 경량 프로세스라고 부르기도 함
- 프로세스의 공유자원을 사용할 수 있음
2-1. 멀티 스레딩
하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것, 이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 갖고 있다.
- 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다. 즉, 독립된 실행 흐름을 갖기 위하여 스택을 가지고 있는 것
- PC 레지스터 값은 스레드가 명령어의 어디까지 수행하였는지를 나타나게 된다. 스레드는 CPU 를 할당받았다가 스케줄러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다.
멀티 스레딩의 장점
-
메모리 공간과 시스템 자원 소모가 줄어들게 된다.
-
프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단하다
- 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap 영역을 이용하여 데이터를 주고받을 수 있기 때문
-
스레드의 context switch 는 프로세스 context switch 와는 달리 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다.
-
시스템의 throughput 이 향상되고 자원 소모가 줄어들며 프로그램의 응답 시간이 단축된다.
멀티 스레딩의 단점
- 멀티 스레딩을 기반으로 프로그래밍할 때는 동일한 자원에 동시에 접근하는 것에 신경써줘야 한다.
- 서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다.
- 그래서, 동기화(Sync) 작업이 필요하다! => 이로 인해, 병목현상이 발생함.
3. 멀티 프로세스 vs 멀티 스레드
멀티 프로세스 | 멀티 스레드 |
---|---|
독립적 | 긴밀하게 연결 |
IPC를 이용한 통신 | 공유된 자원으로 통신 비용 절감 |
자원 소모적, 개별 메모리 차지 | 공유된 자원으로 메모리가 효율적 |
컨텍스트 스위치 비용이 큼 | 컨텍스트 스위치 비용이 적음 |
동기화 작업이 필요 ❌ | 공유 자원 관리 필요 ⭕️ |
프로세스 간 독립적이기 때문에 타 프로세스의 장애으로부터 독립적 | 한 쓰레드에서의 문제가 프로세스 전체에 영향을 줄 수 있음 |
✔ 구글 Chrome은 기본적으로 각각의 탭이 멀티 프로세스이다.
참고: Byrce님 블로그, 한재엽님 깃허브